package cn.scs.component;

import java.io.FileInputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

public class DatanodeFinder {
    private final Map<String, String> datanodeMap;
    private final Map<String, Integer> portMap;

    public DatanodeFinder(String configFile) {
        // 加载数据节点映射和端口映射
        datanodeMap = new HashMap<>();
        portMap = new HashMap<>();
        loadDatanodeMap(configFile);
        loadPortMap(configFile);
    }

    private void loadDatanodeMap(String configFile) {
        Properties properties = new Properties();
        try (FileInputStream fis = new FileInputStream(configFile)) {
            properties.load(fis);
            for (String key : properties.stringPropertyNames()) {
                if (!key.startsWith("port.")) { // 不以port 开头 为name
                    String value = properties.getProperty(key);
                    datanodeMap.put(key, value);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
            // 或者在加载数据节点映射时抛出异常，以便在实例化 DatanodeFinder 时进行处理
        }
    }

    private void loadPortMap(String configFile) {
        Properties properties = new Properties();
        try (FileInputStream fis = new FileInputStream(configFile)) {
            properties.load(fis);
            for (String key : properties.stringPropertyNames()) {
                if (key.startsWith("port.")) {
                    String datanodeName = key.substring(5);
                    int port = Integer.parseInt(properties.getProperty(key));
                    portMap.put(datanodeName, port);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
            // 或者在加载端口映射时抛出异常，以便在实例化 DatanodeFinder 时进行处理
        }
    }

    public String getDatanodeIP(String datanodeName) {
        // 查找给定数据节点名称对应的IP地址
        return datanodeMap.get(datanodeName);
    }

    public int getDatanodePort(String datanodeName) {
        // 查找给定数据节点名称对应的端口号地址
        return portMap.getOrDefault(datanodeName, -1);
    }

    // 新增 用于MetaServer获得全局Slave 名称 + 端口信息
    public Map<String, String> getDatanodeMap() {
        return this.datanodeMap;
    }
//    public static void main(String[] args) {
//        String configFile = "datanodes.properties";
//        DatanodeFinder finder = new DatanodeFinder(configFile);
//        String datanodeName = "datanode2";
//        String datanodeIP = finder.getDatanodeIP(datanodeName);
//        int datanodePort = finder.getDatanodePort(datanodeName);
//
//        if (datanodeIP != null && datanodePort != -1) {
//            System.out.println("Datanode " + datanodeName + " IP address: " + datanodeIP);
//            System.out.println("Datanode " + datanodeName + " Port: " + datanodePort);
//        } else {
//            System.out.println("Datanode " + datanodeName + " not found.");
//        }
//    }
}
